// 一．mongodb的聚合操作
// 1.管道命令之 $group   将集合中的⽂档分组， 可⽤于统计结果
// 1.1按照某个字段进行分组
// 	db.db_name.aggregate是语法，所有的管道命令都需要写在其中;
// 	_id 表示分组的依据，按照哪个字段进行分组，需要使用$gender
// 	表示选择这个字段进行分组;
// 	$sum:1 表示把每条数据作为1进行统计，统计的是该分组下面数据的条数.
// 根据性别分组，并统计该分组下的数据的条数，并求每组的平均年龄，最小，最大年龄
db.stu.aggregate(
    {
        $group:
            {
                _id: '$gender',
                counter: {$sum: 1},
                avg_age: {$avg: '$age'},
                min_age: {$min: '$age'},
                max_age: {$max: '$age'}
            }
    }
)

// 1.2group by null $group 的另一种用途就是把整个文档分为一组进行统计
// 	_id:null 表示不指定分组的字段，即统计整个文档，
// 	此时获取的counter表示整个文档的个数
db.stu.aggregate(
    {
        $group:
            {
                _id: null,
                counter: {$sum: 1}
            }
    }
)

// 1.3 数据透视
// 统计不同性别的学生
db.stu.aggregate(
    {
        $group:
            {
                _id: null,
                name: {$push: "$name"}
            }
    }
)

// 使用$$ROOT可以将整个文档放入数组中
db.stu.aggregate(
    {
        $group:
            {
                _id: null,
                name: {$push: "$$ROOT"}
            }
    }
)

// 2.管道命令之 $match   用于进行数据的过滤，是在能够在聚合操作中使用的命令，和find区别在于$match 操作可以把结果交给下一个管道处理，而find不行
// 查询年龄大于20的学生
db.stu.aggregate(
    {$match: {age: {$gt: 20}}}
)

// 查询年龄大于20的男女学生的人数
db.stu.aggregate(
    {$match: {age: {$gt: 20}}},
    {$group: {_id: "$gender", name: {$push: '$name'}}}
)

// 3.管道命令之 $project  用于修改文档的输入输出结构，例如重命名，增加，删除字段
// 查询学生的年龄、姓名，仅输出年龄姓名
db.stu.aggregate(
    {$project: {_id: 0, name: 1, age: 1}}
)

// 查询男女生人生，输出人数
db.stu.aggregate(
    {$group: {_id: "$gender", counter: {$sum: 1}}},
    {$project: {_id: 0, counter: 1}}
)

// 4.管道命令之 $sort 用于将输入的文档排序后输出
// 查询学生信息，按照年龄升序
db.stu.aggregate({$sort: {age: 1}})

// 查询男女人数，按照人数降序
db.stu.aggregate(
    {$group: {_id: "$gender", counter: {$sum: 1}}},
    {$sort: {counter: -1}}
)


// 5.管道命令之 $skip 和 $limit
// $limit限制返回数据的条数
// $skip 跳过指定的文档数，并返回剩下的文档数
// 同时使用时先使用skip在使用limit

// 查询2条学生信息
db.stu.aggregate(
    {$limit: 2}
)

// 查询从第三条开始的学生信息
db.stu.aggregate(
    {$skip: 3}
)

// 统计男女生人数，按照人数升序，返回第二条数据
db.stu.aggregate(
    {$group: {_id: "$gender", counter: {$sum: 1}}},
    {$sort: {counter: -1}},
    {$skip: 1},
    {$limit: 1}
)

